#include "../../public/_public.h"

CLogFile logfile;
CTcpServer TcpServer;

// 请求消息封装的格式 <request>Login</request>{消息整体}
enum MsgClass
{
    Login,
    Active
};

// 记录读还有写缓冲区的类
class Msg
{
public:
    char strrecvbuffer[1024];
    char strsendbuffer[1024];
};

bool ser_Active(char strrequest[]);
bool ser_Login(char strrequest[]);
bool _main(int msgclass,char strrequest[]);

int main(int argc, char *argv[])
{
    // Help
    // 参数解析
    // 同步，网络服务器

    if (argc != 3)
    {
        printf("Using:./fileserver port logfile\nExample:./fileserver 5005 /log/idc/fileserver.log\n\n");
        return -1;
    }

    if (logfile.Open(argv[2], "a+") == false)
    {
        printf("logfile.Open(%s) failed.\n", argv[2]);
        return -1;
    }
    if (false == TcpServer.InitServer(atoi(argv[1])))
    {
        logfile.Write("服务器初始化失败\n");
        return -1;
    }

    while (true)
    {
        /* code */
        if (false == TcpServer.Accept())
        {
            logfile.Write("服务Accept失败\n");
            return -1;
        }
        else
        {
            logfile.Write("客户端%s连接成功\n", TcpServer.GetIP());
        }

        // 开始读客户端的请求,这边应该 开一个子线程出去
        // 开一个socket出去，不要用while循环Read，使用异步I/O也是可以的,使用epoll监听读事件，异步，read接口交给操作系统
        while (1)
        {
            Msg msg; // 负责一个客户端的消息读写缓冲区，还可以把一些操作封装进去

            if (false == TcpServer.Read(msg.strrecvbuffer,1))
            {
                logfile.Write("Read失败\n");
                // 直接关闭
                TcpServer.CloseClient();
                break;
            }
            else
            {
                int requestCode;
                GetXMLBuffer(msg.strrecvbuffer, "request", &requestCode);
                _main(requestCode,msg.strrecvbuffer);

                // 消息解析
            }
        }
    }

    return 0;
}

// 消息处理函数
bool _main(int msgclass,char strrequest[])
{
    switch (msgclass)
    {
    case MsgClass::Login:
        ser_Login(strrequest);
        break;
    case MsgClass::Active:
        ser_Active(strrequest);
        break;
    default:

        break;
    }
    return true;
}

bool ser_Login(char strrequest[])
{
    //解析参数
    std::cout<<"登录"<<std::endl;
    return true;

}
bool ser_Active(char strrequest[])
{
    //解析参数
    std::cout<<"心跳"<<std::endl;
    return true;
}
